﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.ComponentModel;
using produccion.vistamodelo;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMopermaq.xaml
    /// </summary>
    public partial class FRMopermaq : Window
    {
        opermaq _opermaq;
        public FRMopermaq()
        {
            InitializeComponent();
            _opermaq =(opermaq)this.DataContext;
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            string StrDatoFaltante = PrivStr_ValidarDatos();
            if (StrDatoFaltante == "")
            {
                _opermaq.guardar(wPnot);
                texCod.Focus();
                texCod.Select(0, 0);
            }
            else
            {
                MessageBoxResult result = MessageBox.Show(this, StrDatoFaltante, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private string PrivStr_ValidarDatos()
        {
            string StrDatoDevuelto = "";
            if (radOtr.IsChecked == false && radGua.IsChecked == false && radAyu.IsChecked == false)
            {
                StrDatoDevuelto = "Falta seleccionar tipo de guarnecedor";
            }
            return StrDatoDevuelto;
        }
        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            _opermaq.nuevo();
            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void Filtrar_Closed(object sender, RoutedEventArgs e)
        {
            _opermaq.filtrar();
        }

        private void quiFil_Click(object sender, RoutedEventArgs e)
        {
            _opermaq.quitarFiltros();
        }

        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {
            _opermaq.consultar();
        }

        private void datEmp_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if( _opermaq.selEmp!=null){
            _opermaq.datEmp.CODEMP_EMP = _opermaq.selEmp.CODEMP_EMP;
            _opermaq.consultar();
             }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _opermaq.consultarLista();
            Keyboard.Focus(texCod);
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_opermaq.datEmp.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else
                {
                    _opermaq.datEmp.CAMBIO = false;
                }
            }
        }

        private void busCod(object sender, RoutedEventArgs e)
        {

            FRMbuscar f = new FRMbuscar(new clases.CLSMAEEMPP(), "buscar", "Nombre", "NOMEMP_EMP", "Codigo");
            f.ShowDialog();

            if (f.retorno != "" && !texCod.Text.Equals(f.retorno))
            {
                texCod.Text = f.retorno;

            }
        }

        private void datEmp_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void texBas_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texLim1_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texLim2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texLim3_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texFlo_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texPar1_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texPar2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void texPar3_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        } 
    }

    public class opermaq:ObservableObject 
    {
        //-----------------------------------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }
        
        private VMbuscarGeneral _buscarEmpleado;
        public VMbuscarGeneral buscarEmpleado
        {
            get { return _buscarEmpleado; }
            set { _buscarEmpleado = value; RaisePropertyChangedEvent("buscarEmpleado"); }
        }

        private List<clases.CLSMAESEC> _lisSec = new clases.CLSMAESEC().listarSecciones();
        public List<clases.CLSMAESEC> lisSec
        {
            get { return _lisSec; }
            set
            {
                _lisSec = value;
                RaisePropertyChangedEvent("lisSec");
            }
        }

        private List<clases.CLSMAEEMPP> _lisEmp;
        public List<clases.CLSMAEEMPP> lisEmp
        {
            get { return _lisEmp; }
            set
            {
                _lisEmp = value;
                RaisePropertyChangedEvent("lisEmp");
            }
        }

        private List<clases.CLSMAEEMPP> lisEmpTodo;

        private clases.CLSMAEEMPP _filEmp = new clases.CLSMAEEMPP {CODEMP_EMP="",NOMEMP_EMP="",TELEMP_EMP="",CEDEMP_EMP="" };
        public clases.CLSMAEEMPP filEmp {
            get { return _filEmp; }
            set { _filEmp = value;
            RaisePropertyChangedEvent("filEmp");
            }
        }

        private clases.CLSMAEEMPP _datEmp = new clases.CLSMAEEMPP {CODEMP_EMP="",NOMEMP_EMP="",TELEMP_EMP="",CEDEMP_EMP="",SECEMP_EMP="", TIPEMP_EMP="C",TIPGUA_EMP=" ",ESTADO_EMP="S",DIREMP_EMP="",CAMBIO=false };
        public clases.CLSMAEEMPP datEmp {
            get { return _datEmp; }
            set { _datEmp = value;
            RaisePropertyChangedEvent("datEmp");
            }
        }

        private clases.CLSMAEEMPP _selEmp = new clases.CLSMAEEMPP();
        public clases.CLSMAEEMPP selEmp {
            get { return _selEmp; }
            set { _selEmp = value;
            RaisePropertyChangedEvent("selEmp");
            }

        }

        //------------------------------------------------------------
        public opermaq()
        {
            cargarEmpleados();

            MDOgeneral.conectar();
            strTituloVentana = "Operarios y máquinas - Usuario: " + MDOgeneral.usuario + " - [FRMopermaq]";
        }

        private void cargarEmpleados()
        {
            try
            {
                List<clases.CLSMAEEMPP> lisempleados = new clases.CLSMAEEMPP().listaEmpleados();
                _buscarEmpleado = new VMbuscarGeneral((from emp in lisempleados select new
                    VMlistaGenerica { strColumna1 = emp.CODEMP_EMP, strColumna2 = emp.CEDEMP_EMP, strColumna3 = emp.NOMEMP_EMP }).ToList());
                buscarEmpleado.PropertyChanged += onBuscarEmpleadoPropertyChanged;
                buscarEmpleado.gridBuscar.columna1.strNombre = "Código";
                buscarEmpleado.gridBuscar.columna2.strNombre = "Cedula          ";
                buscarEmpleado.gridBuscar.columna3.strNombre = "Nombre                               ";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarEmpleadoPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarEmpleado.IsOpen)
                    {
                        if (buscarEmpleado.gridBuscar.selLista != null)
                        {
                            datEmp.CODEMP_EMP = buscarEmpleado.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarEmpleado;
        public ICommand cmdBuscarEmpleado
        {
            get
            {
                if (_cmdBuscarEmpleado == null)
                {
                    _cmdBuscarEmpleado = new RelayCommand(r => buscar_empleado());
                }
                return _cmdBuscarEmpleado;
            }
        }

        private void buscar_empleado()
        {
            try
            {
                buscarEmpleado.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void filtrar() {
            lisEmp = lisEmpTodo.FindAll(x => x.CODEMP_EMP.ToUpper().Contains(filEmp.CODEMP_EMP.ToUpper()) & x.NOMEMP_EMP.ToUpper().Contains(filEmp.NOMEMP_EMP.ToUpper()) & x.TELEMP_EMP.ToUpper().Contains(filEmp.TELEMP_EMP.ToUpper()) & x.CEDEMP_EMP.ToUpper().Contains(filEmp.CEDEMP_EMP.ToUpper()));
        }
        public void quitarFiltros(){
            lisEmp = lisEmpTodo;
            filEmp = new clases.CLSMAEEMPP { CODEMP_EMP = "", NOMEMP_EMP = "", TELEMP_EMP = "", CEDEMP_EMP = "" };
        }

        public void consultarLista() {
            lisEmpTodo = new clases.CLSMAEEMPP().listaEmpleados();
            lisEmp = lisEmpTodo;
            filtrar();
        }

        public void nuevo() {
            if (datEmp.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
                {
                    datEmp = new clases.CLSMAEEMPP { CODEMP_EMP = "", NOMEMP_EMP = "", TELEMP_EMP = "", CEDEMP_EMP = "", SECEMP_EMP = "", TIPEMP_EMP = "C", TIPGUA_EMP = " ", ESTADO_EMP = "S", DIREMP_EMP = "", CAMBIO = false };
                }
            }
            else {
                datEmp = new clases.CLSMAEEMPP { CODEMP_EMP = "", NOMEMP_EMP = "", TELEMP_EMP = "", CEDEMP_EMP = "", SECEMP_EMP = "", TIPEMP_EMP = "C", TIPGUA_EMP = " ", ESTADO_EMP = "S", DIREMP_EMP = "", CAMBIO = false };
            }
          
         }

        string camb;
        public void consultar() {

              if (datEmp.CODEMP_EMP != camb)
            {
                if (datEmp.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        datEmp.CODEMP_EMP = camb;
                        return;
                    }
                    datEmp.CAMBIO = false;
                }
                camb = datEmp.CODEMP_EMP;
                datEmp.consultar();
                if (!datEmp.EXISTE)
                {
                    datEmp = new clases.CLSMAEEMPP {CODEMP_EMP=camb,NOMEMP_EMP = "", TELEMP_EMP = "", CEDEMP_EMP = "", SECEMP_EMP = "", TIPEMP_EMP = "C", TIPGUA_EMP = " ", ESTADO_EMP = "S", DIREMP_EMP = "", CAMBIO = false };
                }
            }

         
        }

        public void guardar(WrapPanel wPnot) {

            try {

                if (datEmp.EXISTE)
                {
                    if (datEmp.actualizar() > 0)
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados correctamente.", true);
                        datEmp.CAMBIO = false;
                        consultarLista();
                    }
                    else {

                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
                else {

                    if (datEmp.insertar() > 0)
                    {
                        new MDOgeneral.notificar(wPnot, "El operario fue creado correctamente.", true);
                        datEmp.CAMBIO = false;
                        datEmp.EXISTE=true;
                        consultarLista();
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "El operario no puede ser creado correctamente.", false);
                    }
                
                }


            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        
        }
    
    }
}
